package com.heihei.videopreview;

import com.heihei.config.ConfigProperties;
import com.heihei.constant.MessageConstant;
import com.heihei.util.FileUtilF;
import com.heihei.videopreview.entity.VideoHandleEntity;

import java.io.File;
import java.io.IOException;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;

public class VideoPreviewStart {

    /** 当前正在处理的视频记录 */
    public static ConcurrentHashMap<String, String> CURRENT_VIDEO_HANDLING_MAP = new ConcurrentHashMap<>();

    /** 待处理列表 */
    public static List<VideoHandleEntity> PENDING_VIDEO_LIST = Collections.synchronizedList(new ArrayList<>());

    public static void main(String[] args) throws IOException, InterruptedException {
        start();
    }

    /**
     * 方法描述: 开始
     *
     * @param
     * @Return
     * @throws
     * @author duanhengfei
     * @date 2021年02月13日 21:56:45
     */
    public static void start() throws IOException, InterruptedException {
        //初始化SB
        MergeVideoPreviewStart.SB = new StringBuffer();
        System.out.println("输入要处理的视频文件全路径：");
        File validSrcFileOrDir = FileUtilF.getValidSrcPath();
        handleCurrentDirOrFile(validSrcFileOrDir);
    }

    public static void handleCurrentDirOrFile(File validSrcFileOrDir) throws IOException, InterruptedException {
        if(validSrcFileOrDir.isFile()) {
            if(FileUtilF.isVideo(validSrcFileOrDir)) {
                startOneThread(validSrcFileOrDir, new File(validSrcFileOrDir.getParent(), validSrcFileOrDir.getName() + "_preview" + MessageConstant.IMG_STYLE), ConfigProperties.SINGLE_VIDEO_PREVIEW_IMG_COUNT);
            } else {
                System.out.println(MessageConstant.ILLEGAL_FILE_STYLE);
            }
        } else {
            System.out.println("请输入目标目录");
            File validDesDir = FileUtilF.getValidDesDir();
            startHandleDir(validSrcFileOrDir, validDesDir);
        }
    }

    /**
     * 方法描述: 处理文件夹
     *
     * @param validSrcDir
     * @param validDesDir
     * @Return
     * @throws
     * @author duanhengfei
     * @date 2021年02月13日 21:56:35
     */
    private static void startHandleDir(File validSrcDir, File validDesDir) throws IOException, InterruptedException {
        singleDirMultiVideoAddIntoPendingList(validSrcDir, validDesDir, ConfigProperties.SINGLE_VIDEO_PREVIEW_IMG_COUNT);
        //开始处理图片
        while(PENDING_VIDEO_LIST.size() > 0) {
            //限制最大运行线程的数量
            if(CURRENT_VIDEO_HANDLING_MAP.size() >= ConfigProperties.MAX_SYNC_HANDLE_VIDEO_COUNT) {
                Thread.sleep(3000);
                continue;
            }
            VideoHandleEntity entity = PENDING_VIDEO_LIST.get(PENDING_VIDEO_LIST.size() - 1);
            startOneThread(entity.getVideoFile(), entity.getTargetPreviewImgFile(), entity.getPreviewImgCount());
            PENDING_VIDEO_LIST.remove(PENDING_VIDEO_LIST.size() - 1);
        }
        while(true) {
            if(CURRENT_VIDEO_HANDLING_MAP.size() <= 0) {
                break;
            }
            Thread.sleep(3000);
        }
        System.out.println(MessageConstant.EVERYTHING_IS_OK);
        System.out.println("本次处理目录：");
        System.out.println(MergeVideoPreviewStart.SB);
    }

    /**
     * 方法描述: 文件夹下的所有视频 添加进待处理队列
     *
     * @param parentDir
     * @param targetDir
     * @param everyCount
     * @Return
     * @throws
     * @author duanhengfei
     * @date 2021年02月13日 11:02:14
     */
    public static void singleDirMultiVideoAddIntoPendingList(File parentDir, File targetDir, int everyCount) throws IOException {
        if(!parentDir.exists()) {
            return;
        }
        if(!targetDir.exists()) {
            targetDir.mkdirs();
        }
        FileUtilF.handleFiles(parentDir, file -> {
            if(FileUtilF.isVideo(file)) {
                PENDING_VIDEO_LIST.add(new VideoHandleEntity(file, new File(targetDir, file.getAbsolutePath().substring(parentDir.getAbsolutePath().length()) + "_preview" + MessageConstant.IMG_STYLE), everyCount));
//                    singleVideoRandomPreviewImg(file, new File(targetDir, file.getAbsolutePath().substring(parentDir.getAbsolutePath().length()) + MessageConstant.IMG_STYLE), everyCount);
            }
        });
    }

    /**
     * 方法描述: 开启一个线程，处理一个视频
     *
     * @param videoFile
     * @param targetPreviewImgFile
     * @param previewImgCount
     * @Return
     * @throws
     * @author duanhengfei
     * @date 2021年02月13日 21:03:30
     */
    public static void startOneThread(File videoFile, File targetPreviewImgFile, Integer previewImgCount) {
        //处理图片的父级文件夹
        File imgParentDir = targetPreviewImgFile.getParentFile();
        if(!imgParentDir.exists()) {
            imgParentDir.mkdirs();
        }
        String threadId = UUID.randomUUID().toString().replaceAll("-", "");
        CreateVideoPreview cv = new CreateVideoPreview(threadId, videoFile, targetPreviewImgFile, previewImgCount);
        Thread th01 = new Thread(cv);
        th01.start();
        //添加进 CURRENT_VIDEO_HANDLING_MAP
        CURRENT_VIDEO_HANDLING_MAP.put(threadId, videoFile.getAbsolutePath());
    }
}